package util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 与えられたbyteデータをハッシュ化するクラス
 * 
 * @author kosugi
 * @since 2011/12/03
 * @value ALGO SHA-226,MD5 暗号化アルゴリズム
 */
public class Digest {

	/**
	 * 暗号化アルゴリズム。
	 */
	private  static final String ALGO = "SHA-256";

	/**
	 * ハッシュ化するメソッド
	 * 
	 * ここではbyte化の処理のみであり、hashByteToStringメソッドで
	 * ハッシュ表記への変換を行う。
	 * @param value 暗号化する文字列
	 * @return String result 暗号化された文字列
	 * @throws NoSuchAlgorithmException
	 */
	public static String encrypt (String value) throws NoSuchAlgorithmException {
		byte[] values = value.getBytes();
		String result = null;
		MessageDigest hash = MessageDigest.getInstance(ALGO);
		hash.update(values);
		result = hashByteToString(hash.digest());
		return result;
	} 
 
	/**
	 * byte化された文字列を16真数表記にてハッシュ化するメソッド
	 * 
	 * @param hash byte化された暗号化する文字列
	 * @return String result 暗号化された文字列
	 */
	private static String hashByteToString(byte [] hash) {
		StringBuffer hexString = new StringBuffer();
		String result = null;
		// 1byte ずつ 16 進数表記に変える
		for (int i = 0; i < hash.length; i++)  {
			// 上位 4bit が 0 のとき、一桁になるので先頭に 0 を追加してやる
			if((0xff & hash[i]) < 0x10) {
				hexString.append("0" + Integer.toHexString((0xFF) & hash[i]));
			} else {
				hexString.append(Integer.toHexString((0xFF) & hash[i]));
			}
		} 
		result = hexString.toString();
		return result;
	} 
}
